home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / bit / src / ulib / msleep.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  2KB  |  108 lines

  1. /***********************************************************************
  2.  * $Id: msleep.c,v 0.80 1994/02/24 09:48:11 zhao Exp $
  3.  *
  4.  *.  Copyright(c) 1993,1994 by T.C. Zhao
  5.  *   All rights reserved.
  6.  *.
  7.  *   malarm and msleep are same as alarm(3C) and sleep(3C)
  8.  *   but with milliseconds resolution (or tries to be). If
  9.  *   using sginap, about 10msec.
  10.  *
  11.  ***********************************************************************/
  12. #if !defined(lint) && defined(F_ID)
  13. char *id_mslep = "$Id: msleep.c,v 0.80 1994/02/24 09:48:11 zhao Exp $";
  14. #endif
  15.  
  16. #include <stdio.h>
  17. #include "unistd.h"
  18. #include <sys/time.h>
  19. #include "ulib.h"
  20.  
  21. #define USE_SGI_NAP        /* better than mine */
  22.  
  23. #ifdef USE_SGI_NAP
  24.  
  25. #include <limits.h>        /* For CLK_TCK */
  26.  
  27. /* This is not necessary on SGI machines, useful for dry compile
  28.  * on other machines */
  29.  
  30. #ifndef CLK_TCK
  31. #define CLK_TCK 100
  32. #endif
  33.  
  34.  
  35. unsigned
  36. msleep(unsigned msec)
  37. {
  38.     long ntics = (msec * CLK_TCK) / 1000;
  39.     sginap(ntics ? ntics : 1);
  40.     return 0;
  41. }
  42.  
  43. #else /* use my own hack */
  44.  
  45. #define RET_TYPE void        /* BSD signal handler returns int */
  46. #define RET_VAL            /* if type is int, define it to 0 */
  47.  
  48. unsigned
  49. malarm(unsigned msecs)
  50. {
  51.     register unsigned sec = msecs / 1000, usec = (msecs % 1000) * 1000;
  52.     struct itimerval timer, otimer;
  53.  
  54.     timer.it_value.tv_sec = sec;
  55.     timer.it_value.tv_usec = usec;
  56.     timer.it_interval.tv_sec = 0;
  57.     timer.it_interval.tv_usec = 0;
  58.  
  59.     if (setitimer(ITIMER_REAL, &timer, &otimer))
  60.     perror("setitimer");
  61.  
  62.     return (otimer.it_value.tv_sec * 1000 + otimer.it_value.tv_usec / 1000);
  63. }
  64.  
  65. #include <signal.h>
  66. #include <setjmp.h>
  67.  
  68. static jmp_buf jmpbuf;
  69. static RET_TYPE(*osighandler) (int);
  70.  
  71. static RET_TYPE
  72. trapalarm(int sig)
  73. {
  74.     if (sig != SIGALRM)
  75.     (void) fprintf(stderr, "Unexpected signal in msleep: %d\n", sig);
  76.  
  77.     /* return anyway */
  78.     (void) signal(SIGALRM, osighandler);
  79.     longjmp(jmpbuf, 1);
  80.  
  81.     return RET_VAL;
  82. }
  83.  
  84. static unsigned remaining;
  85.  
  86. unsigned
  87. msleep(unsigned msec)
  88. {
  89.     if (msec == 0)
  90.     return 0;
  91.  
  92.     /*
  93.      * save old alarm handler, which is restored by the new handler when it
  94.      * returns
  95.      */
  96.  
  97.     osighandler = signal(SIGALRM, trapalarm);
  98.  
  99.     if (setjmp(jmpbuf) != 0)    /* alarm has expired */
  100.     return remaining;
  101.  
  102.     remaining = malarm(msec);
  103.     pause();
  104.  
  105.     return 0;
  106. }
  107. #endif
  108.